// 导入uni-id-common模块和数据库
// 使用相对路径引用uni_modules中的模块
const uniID = require('../../../../uni_modules/uni-id-common/uniCloud/cloudfunctions/common/uni-id-common/index.js');
const db = uniCloud.database();
const _ = db.command;
// 导入配置中心
const createConfigCenter = require('../../../uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/index.js');

/**
 * 点赞或取消点赞动态
 * @param {Object} event 客户端传入的参数
 * @param {String} event.token 用户token
 * @param {String} event.postId 动态ID
 * @param {Boolean} event.isLike 是否点赞（true:点赞，false:取消点赞）
 * @param {Object} context 上下文信息
 */
exports.main = async (event, context) => {
  const { token, postId, isLike = true } = event;
  
  // 初始化配置中心并获取uni-id配置
  const config = createConfigCenter({ pluginId: 'uni-id' });
  const uniIdConfig = config.config();
  
  // 初始化uniID实例
  const uniIDIns = uniID.createInstance({
    context,
    config: uniIdConfig
  });
  
  // 校验参数
  if (!token) {
    return {
      code: 1,
      message: '请先登录'
    };
  }
  
  if (!postId) {
    return {
      code: 1,
      message: '动态ID不能为空'
    };
  }
  
  try {
    // 校验token
    const checkTokenRes = await uniIDIns.checkToken(token);
    if (checkTokenRes.code) {
      return {
        code: checkTokenRes.code,
        message: checkTokenRes.errMsg || '登录状态失效，请重新登录'
      };
    }
    
    // 获取用户ID
    const userId = checkTokenRes.uid;
    
    // 检查动态是否存在
    const dynamicCollection = db.collection('dynamic_posts');
    const postRes = await dynamicCollection.doc(postId).get();
    
    if (!postRes.data) {
      return {
        code: 1,
        message: '动态不存在'
      };
    }
    
    // 检查动态权限（如果是私密动态，只有发布者和关注者可以点赞）
    const post = postRes.data;
    if (post.privacy === 'private' && post.userId !== userId) {
      // 检查是否是关注者
      const followRes = await db.collection('user_follows')
        .where({
          userId: userId,
          followId: post.userId
        })
        .count();
      
      if (followRes.total === 0) {
        return {
          code: 1,
          message: '无权限点赞此动态'
        };
      }
    }
    
    // 获取点赞记录集合
    const likesCollection = db.collection('post_likes');
    
    if (isLike) {
      // 点赞操作
      // 检查是否已经点赞
      const existingLikeRes = await likesCollection
        .where({
          userId: userId,
          postId: postId
        })
        .count();
      
      if (existingLikeRes.total > 0) {
        return {
          code: 0,
          message: '已经点赞过了',
          data: {
            isLiked: true,
            likeCount: post.likeCount
          }
        };
      }
      
      // 开始事务
      const transaction = await db.startTransaction();
      
      try {
        // 添加点赞记录
        await transaction.collection('post_likes').add({
          userId: userId,
          postId: postId,
          createTime: new Date().getTime()
        });
        
        // 更新动态点赞数
        await transaction.collection('dynamic_posts')
          .doc(postId)
          .update({
            likeCount: _.inc(1)
          });
        
        // 提交事务
        await transaction.commit();
        
        // 查询更新后的点赞数
        const updatedPostRes = await dynamicCollection.doc(postId).field({ likeCount: true }).get();
        
        return {
          code: 0,
          message: '点赞成功',
          data: {
            isLiked: true,
            likeCount: updatedPostRes.data.likeCount
          }
        };
      } catch (error) {
        // 回滚事务
        await transaction.rollback();
        throw error;
      }
    } else {
      // 取消点赞操作
      // 开始事务
      const transaction = await db.startTransaction();
      
      try {
        // 删除点赞记录
        await transaction.collection('post_likes')
          .where({
            userId: userId,
            postId: postId
          })
          .remove();
        
        // 更新动态点赞数
        await transaction.collection('dynamic_posts')
          .doc(postId)
          .update({
            likeCount: _.max([0, _.inc(-1)])
          });
        
        // 提交事务
        await transaction.commit();
        
        // 查询更新后的点赞数
        const updatedPostRes = await dynamicCollection.doc(postId).field({ likeCount: true }).get();
        
        return {
          code: 0,
          message: '取消点赞成功',
          data: {
            isLiked: false,
            likeCount: updatedPostRes.data.likeCount
          }
        };
      } catch (error) {
        // 回滚事务
        await transaction.rollback();
        throw error;
      }
    }
  } catch (error) {
    console.error('点赞操作失败:', error);
    return {
      code: 1,
      message: '操作失败，请重试',
      data: error.message
    };
  }
};